package com.wang.common.core.utils;

import com.wang.common.core.constants.JWTConstants;
import io.jsonwebtoken.Claims;
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;

import java.util.Map;

public class JWTUtil {
    /**
     * 生成令牌
     *
     * @param claims 数据
     * @param secret 密钥
     * @return 令牌
     */
    public static String createToken(Map<String, Object> claims, String secret) {
        String token = Jwts.builder()
                //注: 这里不手动设置Header 是因为 使用Jwts工具类的builder()默认自动设置Header(typ为JWT,alg为HS256)
                .setClaims(claims) //将自定义的声明数据claim设置到载荷中
                .signWith(SignatureAlgorithm.HS512,secret) //使用传入的密钥secret进行加盐加密(生成signature)
                .compact(); //拼接成最终的JWT文本

        return token;
    }
    /**
     * 从令牌中获取数据
     *
     * @param token 令牌
     * @param secret 密钥
     * @return 数据
     */
    public static Claims parseToken(String token, String secret) {
        //parser(): 生成一个JwtParser解析器
        //setSigningKey(): 设置密钥 (这里的密钥必须与生成JWT时使用的密钥相同,否则无法正确解密)
        //--设置密钥之后进行解密
        //parseClaimsJws(token): 验证 并 解析 传入的token
        //getBody(): 获取JWT的Payload
        return Jwts.parser().setSigningKey(secret).parseClaimsJws(token).getBody();
    }


    /**
     * 获取令牌中的userId
     * @param claims 令牌
     * @return 返回获取到的userId
     */
    public static String getUserId(Claims claims){
        Object object = claims.get(JWTConstants.USER_ID);
        if (object == null){
            return "";
        }
        return object.toString();
    }

}